package org.jsping.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.jsping.util.DBUtil;

/**
 * 数据库连接与关闭工具类。
 */
public class BaseDao {
	protected Connection conn = null;
	protected PreparedStatement pstmt = null;
	protected ResultSet rs = null;
	
	/**
	 * 在查询操作中，获取结果完毕后必须调用此方法释放资源
	 * 
	 * @param conn
	 * @param stmt
	 * @param rs
	 */
	public void releaseAll() {
		DBUtil.releaseAll(conn, pstmt, rs);
		conn = null;
		pstmt = null;
		rs = null;
	}

	/**
	 * 获取数据库连接对象。
	 * 
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException {
		return DBUtil.getConnection();
	}

	/**
	 * 关闭数据库所有的连接
	 * 
	 * @param conn
	 * @param stmt
	 * @param rs
	 */
	private void closeAll(Connection conn, Statement stmt, ResultSet rs) {
		DBUtil.releaseAll(conn, stmt, rs);
	}

	/**
	 * 增 删 改 操作操作
	 * 
	 * @param sql
	 *            数据库语句
	 * @param params
	 *            参数
	 * @return 失败返回0，成果返回受影响的行数
	 */
	protected int executeUpdate(String sql, Object... params) throws SQLException {
		int result = 0;
		try {
			conn = this.getConnection();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		PreparedStatement pstmt = null;
		pstmt = conn.prepareStatement(sql);
		for (int i = 0; i < params.length; i++) {
			pstmt.setObject(i + 1, params[i]);
		}
		result = pstmt.executeUpdate();

		return result;
	}

	/**
	 * 查询操作
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数列表
	 * @return 返回ResultSet 失败返回null
	 */
	protected ResultSet executeQuery(String sql, Object... params) throws SQLException {
		try {
			conn = this.getConnection();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		pstmt = conn.prepareStatement(sql);
		if(params!=null) {
			for (int i = 0; i < params.length; i++) {
				pstmt.setObject(i + 1, params[i]);
			}
		}
		rs = pstmt.executeQuery();
		return rs;
	}
}
